﻿using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using LinFu.IoC.Configuration;
using LinFu.IoC.Interfaces;

namespace CoreEx.ServiceModel
{
    /// <summary>
    /// Provides a base class for implementing the <see cref="IServiceBehavior"/> interface.
    /// </summary>
    public abstract class ServiceBehaviorBase : IServiceBehavior, IInitialize
    {
        /// <summary>
        /// Gets the <see cref="IServiceContainer"/> that 
        /// created this <see cref="IServiceBehavior"/> instance.
        /// </summary>
        protected IServiceContainer ServiceContainer { get; private set; }

        /// <summary>
        /// Provides the ability to inspect the service host and the service description to confirm that the service can run successfully.
        /// </summary>
        /// <param name="serviceDescription">The service description.</param>
        /// <param name="serviceHostBase">The service host that is currently being constructed.</param>
        public virtual void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {            
        }

        /// <summary>
        /// Provides the ability to pass custom data to binding elements to support the contract implementation.
        /// </summary>
        /// <param name="serviceDescription">The service description of the service.</param>
        /// <param name="serviceHostBase">The host of the service.</param>
        /// <param name="endpoints">The service endpoints.</param>
        /// <param name="bindingParameters">Custom objects to which binding elements have access.</param>
        public virtual void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
        {

        }

        /// <summary>
        /// Provides the ability to change run-time property values or insert custom extension objects such as error handlers, message or parameter interceptors, security extensions, and other custom extension objects.
        /// </summary>
        /// <param name="serviceDescription">The service description.</param>
        /// <param name="serviceHostBase">The host that is currently being built.</param>
        public abstract void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase);


        /// <summary>
        /// Initializes this service instance.
        /// </summary>        
        public virtual void Initialize(IServiceContainer source)
        {
            ServiceContainer = source;
        }
    }
}
